package me.yangzhi.day_12.adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import me.yangzhi.day_12.R;
import me.yangzhi.day_12.model.ChatMessage;

/**
 * 聊天消息列表适配器
 * 用于将消息数据绑定到RecyclerView中显示
 * 实现了不同消息的左右对齐和长按删除功能
 */
public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.MessageViewHolder> {
    // 存储所有聊天消息的列表
    private List<ChatMessage> messages = new ArrayList<>();
    // 长按消息的回调接口
    private OnMessageLongClickListener longClickListener;

    /**
     * 长按消息的回调接口定义
     * 由Activity实现此接口来处理消息的删除操作
     */
    public interface OnMessageLongClickListener {
        void onMessageLongClick(ChatMessage message);
    }

    /**
     * 构造函数
     * @param listener 长按消息的回调接口实现
     */
    public ChatAdapter(OnMessageLongClickListener listener) {
        this.longClickListener = listener;
    }

    /**
     * 创建ViewHolder
     * 加载消息项的布局并创建ViewHolder
     */
    @NonNull
    @Override
    public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        // 加载消息项布局
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_message, parent, false);
        return new MessageViewHolder(view);
    }

    /**
     * 绑定ViewHolder
     * 将消息数据绑定到ViewHolder上
     */
    @Override
    public void onBindViewHolder(@NonNull MessageViewHolder holder, int position) {
        ChatMessage message = messages.get(position);
        holder.bind(message);
    }

    /**
     * 返回消息列表的大小
     */
    @Override
    public int getItemCount() {
        return messages.size();
    }

    /**
     * 设置新的消息列表
     * 用于首次加载或刷新全部消息
     * @param messages 新的消息列表
     */
    public void setMessages(List<ChatMessage> messages) {
        this.messages = messages;
        notifyDataSetChanged();
    }

    /**
     * 添加单条新消息
     * 用于发送或接收新消息时
     * @param message 新消息
     */
    public void addMessage(ChatMessage message) {
        messages.add(message);
        notifyItemInserted(messages.size() - 1);
    }

    /**
     * 删除指定消息
     * 用于长按删除消息时
     * @param message 要删除的消息
     */
    public void removeMessage(ChatMessage message) {
        int position = messages.indexOf(message);
        if (position != -1) {
            messages.remove(position);
            notifyItemRemoved(position);
        }
    }

    /**
     * 消息ViewHolder类
     * 负责管理消息项视图的各个组件
     */
    class MessageViewHolder extends RecyclerView.ViewHolder {
        // 消息文本显示控件
        private TextView textViewMessage;

        MessageViewHolder(@NonNull View itemView) {
            super(itemView);
            textViewMessage = itemView.findViewById(R.id.textViewMessage);
        }

        /**
         * 绑定消息数据到视图
         * 设置消息内容、对齐方式和背景
         * @param message 消息对象
         */
        void bind(ChatMessage message) {
            // 设置消息文本
            textViewMessage.setText(message.getMessage());
            
            // 设置消息对齐方式和背景
            FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) textViewMessage.getLayoutParams();
            if (message.isSent()) {
                // 发送的消息靠右对齐，使用发送消息的背景
                params.gravity = android.view.Gravity.END;
                textViewMessage.setBackgroundResource(R.drawable.message_background_sent);
            } else {
                // 接收的消息靠左对齐，使用接收消息的背景
                params.gravity = android.view.Gravity.START;
                textViewMessage.setBackgroundResource(R.drawable.message_background);
            }
            textViewMessage.setLayoutParams(params);

            // 设置长按监听器，用于删除消息
            itemView.setOnLongClickListener(v -> {
                if (longClickListener != null) {
                    longClickListener.onMessageLongClick(message);
                }
                return true;
            });
        }
    }
} 